/**
 * 装饰器 本质要做的是 操作原型链的操作 所以我们实际上是可以定义多个装饰
 *  比如 多个装饰器修饰同一个类
 */

{
	type Position = {
		x: number
		y: number
	}
	const moveDecorators: ClassDecorator = (target: Function) => {
		target.prototype.getPosotion = (): Position => {
			return { x: 100, y: 200 }
		}
	}

	const musicDecorators: ClassDecorator = (target: Function) => {
		target.prototype.play = () => {
			console.log('播放音乐')
		}
	}

	@moveDecorators
	@musicDecorators
	class Tank {}

	let t1 = new Tank()
	console.log((t1 as any).getPosotion()) //  { x: 100, y: 200 }
	;(t1 as any).play() // 播放音乐

	/**
	 * 以上例子可见 Tank类被两个类装饰器装饰
	 *  叠加装饰 任然是可以使用的
	 *
	 *  原理也很简单 这两个装饰器都是去Tank原型链上添加方法  t1找属性和方法都会攀升原型链去找对应的属性和方法
	 *  所以本质上只要两个装饰器处理的原型属性和方法不重复 都可以一直装饰下去
	 */
}
